ํจ์จ์ ์ธ ๋ฐฐ์น ์ฒ๋ฆฌ ๋ฐ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ณ ๊ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ ๊ธฐ๋ฒ์ ํ์ํ์ธ์. ์ฑ๋ฅ ํฅ์์ ์ํ ๋ฐ์ดํฐ ์กฐ์ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ด์ฉํ ๋ฐฐ์น ์ฒ๋ฆฌ: ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๋ ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ๋ฐ์์ฑ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋ฐฐ์น ์ฒ๋ฆฌ ๋ฐ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๊ฐ์ ๊ธฐ๋ฒ๊ณผ ๊ฒฐํฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ์ฌ๋ ์๊ฒ ๋ค๋ฃจ๋ฉฐ, ๋ฐ์ดํฐ ์กฐ์ ์ํฌํ๋ก์ฐ๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ์์ ์ ํต์ฐฐ์ ์ ๊ณตํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ์ ํฌํผ ์ดํดํ๊ธฐ
๋ฐฐ์น ๋ฐ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ์ ํฌํผ์ ๋ํ ํ์คํ ์ดํด๋ฅผ ๋ค์ ธ๋ด ์๋ค.
์ดํฐ๋ ์ดํฐ๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ดํฐ๋ ์ดํฐ๋ ์ํ์ค๋ฅผ ์ ์ํ๊ณ ์ข
๋ฃ ์ ๋ฐํ ๊ฐ์ ๊ฐ์ง ์ ์๋ ๊ฐ์ฒด์
๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ๊ตฌํํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ฉฐ, ์ด๋ ๋ ๊ฐ์ง ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ next() ๋ฉ์๋๋ฅผ ๊ฐ์ง๋๋ค:
value: ์ํ์ค์ ๋ค์ ๊ฐ.done: ์ดํฐ๋ ์ดํฐ๊ฐ ์๋ฃ๋์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ.
์ดํฐ๋ ์ดํฐ๋ ์ปฌ๋ ์ ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ ธ์ถํ์ง ์๊ณ ํ ๋ฒ์ ํ๋์ฉ ์์์ ์ ๊ทผํ ์ ์๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด
์ดํฐ๋ฌ๋ธ์ ๋ฐ๋ณตํ ์ ์๋ ๊ฐ์ฒด์
๋๋ค. Symbol.iterator ๋ฉ์๋๋ฅผ ํตํด ์ดํฐ๋ ์ดํฐ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ผ๋ฐ์ ์ธ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด์๋ ๋ฐฐ์ด, ๋ฌธ์์ด, ๋งต, ์
, ๊ทธ๋ฆฌ๊ณ arguments ๊ฐ์ฒด๊ฐ ์์ต๋๋ค.
์์ :
const myArray = [1, 2, 3];
const iterator = myArray[Symbol.iterator]();
console.log(iterator.next()); // ์ถ๋ ฅ: { value: 1, done: false }
console.log(iterator.next()); // ์ถ๋ ฅ: { value: 2, done: false }
console.log(iterator.next()); // ์ถ๋ ฅ: { value: 3, done: false }
console.log(iterator.next()); // ์ถ๋ ฅ: { value: undefined, done: true }
์ดํฐ๋ ์ดํฐ ํฌํผ: ํ๋์ ์ธ ์ ๊ทผ ๋ฐฉ์
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ์ดํฐ๋ ์ดํฐ์ ๋ํด ์๋ํ์ฌ ์์ฑ๋๋ ๊ฐ์ ๋ณํํ๊ฑฐ๋ ํํฐ๋งํ๋ ํจ์์ ๋๋ค. ์ ํต์ ์ธ ๋ฃจํ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๋นํด ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ ๊ฐ๊ฒฐํ๊ณ ํํ๋ ฅ ์๊ฒ ์กฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ค๋ฅธ ์ธ์ด๋ค์ฒ๋ผ ๋ด์ฅ ์ดํฐ๋ ์ดํฐ ํฌํผ๊ฐ ์์ง๋ง, ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์ดํฐ๋ ์ดํฐ๋ฅผ ์ด์ฉํ ๋ฐฐ์น ์ฒ๋ฆฌ
๋ฐฐ์น ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ์ด ์๋, ๊ฐ๋ณ ๊ทธ๋ฃน ๋๋ '๋ฐฐ์น' ๋จ์๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํนํ ๋คํธ์ํฌ ์์ฒญ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ ์์ฉ๊ณผ ๊ฐ์ด ์ค๋ฒํค๋ ๋น์ฉ์ด ์๋ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ํจ์จ์ ์ผ๋ก ๋ฐฐ์น๋ก ๋๋ ์ ์์ต๋๋ค.
๋ฐฐ์น ์ดํฐ๋ ์ดํฐ ํฌํผ ๋ง๋ค๊ธฐ
์ดํฐ๋ ์ดํฐ์ ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ์ง์ ๋ ๋ฐฐ์น ํฌ๊ธฐ์ ๋ฐฐ์ด์ ์ฐ์ถ(yield)ํ๋ ์๋ก์ด ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ batch ํฌํผ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
function* batch(iterator, batchSize) {
let currentBatch = [];
for (const value of iterator) {
currentBatch.push(value);
if (currentBatch.length === batchSize) {
yield currentBatch;
currentBatch = [];
}
}
if (currentBatch.length > 0) {
yield currentBatch;
}
}
์ด batch ํจ์๋ ์ ๋๋ ์ดํฐ ํจ์(function ๋ค์ *๋ก ํ์)๋ฅผ ์ฌ์ฉํ์ฌ ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค. ์
๋ ฅ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐ๋ณตํ๋ฉด์ currentBatch ๋ฐฐ์ด์ ๊ฐ์ ๋์ ํฉ๋๋ค. ๋ฐฐ์น๊ฐ ์ง์ ๋ batchSize์ ๋๋ฌํ๋ฉด ๋ฐฐ์น๋ฅผ ์ฐ์ถ(yield)ํ๊ณ currentBatch๋ฅผ ์ฌ์ค์ ํฉ๋๋ค. ๋จ์ ๊ฐ๋ค์ ๋ง์ง๋ง ๋ฐฐ์น๋ก ์ฐ์ถ๋ฉ๋๋ค.
์์ : API ์์ฒญ ๋ฐฐ์น ์ฒ๋ฆฌ
๋ง์ ์์ ์ฌ์ฉ์ ID์ ๋ํ ๋ฐ์ดํฐ๋ฅผ API์์ ๊ฐ์ ธ์์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๊ฐ ์ฌ์ฉ์ ID์ ๋ํด ๊ฐ๋ณ์ ์ธ API ์์ฒญ์ ํ๋ ๊ฒ์ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ๋ฐฐ์น ์ฒ๋ฆฌ๋ ์์ฒญ ์๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
async function fetchUserData(userId) {
// API ์์ฒญ์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค
return new Promise(resolve => {
setTimeout(() => {
resolve({ userId: userId, data: `Data for user ${userId}` });
}, 50);
});
}
async function* userIds() {
for (let i = 1; i <= 25; i++) {
yield i;
}
}
async function processUserBatches(batchSize) {
for (const batchOfIds of batch(userIds(), batchSize)) {
const userDataPromises = batchOfIds.map(fetchUserData);
const userData = await Promise.all(userDataPromises);
console.log("Processed batch:", userData);
}
}
// ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ 5๊ฐ์ฉ ๋ฐฐ์น๋ก ์ฒ๋ฆฌ
processUserBatches(5);
์ด ์์ ์์ userIds ์ ๋๋ ์ดํฐ ํจ์๋ ์ฌ์ฉ์ ID ์คํธ๋ฆผ์ ์ฐ์ถํฉ๋๋ค. batch ํจ์๋ ์ด ID๋ค์ 5๊ฐ์ฉ์ ๋ฐฐ์น๋ก ๋๋๋๋ค. ๊ทธ๋ฐ ๋ค์ processUserBatches ํจ์๋ ์ด ๋ฐฐ์น๋ค์ ๋ฐ๋ณตํ๋ฉด์ Promise.all์ ์ฌ์ฉํ์ฌ ๊ฐ ์ฌ์ฉ์ ID์ ๋ํ API ์์ฒญ์ ๋ณ๋ ฌ๋ก ์ํํฉ๋๋ค. ์ด๋ ๋ชจ๋ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ํ์ํ ์ ์ฒด ์๊ฐ์ ๊ทน์ ์ผ๋ก ์ค์ฌ์ค๋๋ค.
๋ฐฐ์น ์ฒ๋ฆฌ์ ์ด์
- ์ค๋ฒํค๋ ๊ฐ์: ๋คํธ์ํฌ ์์ฒญ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋๋ ํ์ผ I/O์ ๊ฐ์ ์์ ๊ณผ ๊ด๋ จ๋ ์ค๋ฒํค๋๋ฅผ ์ต์ํํฉ๋๋ค.
- ์ฒ๋ฆฌ๋ ํฅ์: ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฒ๋ฆฌ๋์ ํฌ๊ฒ ๋๋ฆด ์ ์์ต๋๋ค.
- ์์ ์ต์ ํ: ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ฉ์ด๋ฆฌ๋ก ์ฒ๋ฆฌํ์ฌ ์์ ํ์ฉ์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ดํฐ๋ ์ดํฐ๋ฅผ ์ด์ฉํ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ
๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ํน์ ๊ธฐ์ค์ด๋ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์๋ฅผ ๊ทธ๋ฃนํํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ณตํต๋ ํน์ฑ์ ๊ณต์ ํ๋ ๋ฐ์ดํฐ์ ํ์ ์งํฉ์ ๋ํ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ตํ ๊ทธ๋ฃนํ ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ทธ๋ฃนํ ์ดํฐ๋ ์ดํฐ ํฌํผ ๋ง๋ค๊ธฐ
์ดํฐ๋ ์ดํฐ์ ํค ์ ํ์ ํจ์๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์, ๋์ผํ ํค๋ฅผ ๊ฐ์ง ์์๋ค์ ๊ทธ๋ฃน์ ๋ํ๋ด๋ ๊ฐ์ฒด๋ค์ ์ฐ์ถํ๋ ์๋ก์ด ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ groupBy ํฌํผ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
function* groupBy(iterator, keySelector) {
const groups = new Map();
for (const value of iterator) {
const key = keySelector(value);
if (!groups.has(key)) {
groups.set(key, []);
}
groups.get(key).push(value);
}
for (const [key, values] of groups) {
yield { key: key, values: values };
}
}
์ด groupBy ํจ์๋ Map์ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃน์ ์ ์ฅํฉ๋๋ค. ์
๋ ฅ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐ๋ณตํ๋ฉด์ ๊ฐ ์์์ keySelector ํจ์๋ฅผ ์ ์ฉํ์ฌ ๊ทธ๋ฃน์ ๊ฒฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ์์๋ฅผ ๋งต์ ํด๋น ๊ทธ๋ฃน์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋งต์ ๋ฐ๋ณตํ๋ฉฐ ๊ฐ ๊ทธ๋ฃน์ ๋ํด ํค์ ๊ฐ ๋ฐฐ์ด์ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ์ฐ์ถํฉ๋๋ค.
์์ : ๊ณ ๊ฐ ID๋ณ ์ฃผ๋ฌธ ๊ทธ๋ฃนํ
์ฃผ๋ฌธ ๊ฐ์ฒด ์คํธ๋ฆผ์ด ์๊ณ ๊ฐ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ ํจํด์ ๋ถ์ํ๊ธฐ ์ํด ๊ณ ๊ฐ ID๋ณ๋ก ๊ทธ๋ฃนํํ๋ ค๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค.
function* orders() {
yield { orderId: 1, customerId: 101, amount: 50 };
yield { orderId: 2, customerId: 102, amount: 100 };
yield { orderId: 3, customerId: 101, amount: 75 };
yield { orderId: 4, customerId: 103, amount: 25 };
yield { orderId: 5, customerId: 102, amount: 125 };
yield { orderId: 6, customerId: 101, amount: 200 };
}
function processOrdersByCustomer() {
for (const group of groupBy(orders(), order => order.customerId)) {
const customerId = group.key;
const customerOrders = group.values;
const totalAmount = customerOrders.reduce((sum, order) => sum + order.amount, 0);
console.log(`Customer ${customerId}: Total Amount = ${totalAmount}`);
}
}
processOrdersByCustomer();
์ด ์์ ์์ orders ์ ๋๋ ์ดํฐ ํจ์๋ ์ฃผ๋ฌธ ๊ฐ์ฒด ์คํธ๋ฆผ์ ์ฐ์ถํฉ๋๋ค. groupBy ํจ์๋ ์ด ์ฃผ๋ฌธ๋ค์ customerId๋ณ๋ก ๊ทธ๋ฃนํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ processOrdersByCustomer ํจ์๋ ์ด ๊ทธ๋ฃน๋ค์ ๋ฐ๋ณตํ๋ฉด์ ๊ฐ ๊ณ ๊ฐ์ ์ด ์ฃผ๋ฌธ ๊ธ์ก์ ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ก๊น
ํฉ๋๋ค.
๊ณ ๊ธ ๊ทธ๋ฃนํ ๊ธฐ๋ฒ
groupBy ํฌํผ๋ ๋ ๊ณ ๊ธ ๊ทธ๋ฃนํ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ๋๋ก ํ์ฅ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ groupBy ์ฐ์ฐ์ ์์ฐจ์ ์ผ๋ก ์ ์ฉํ์ฌ ๊ณ์ธต์ ๊ทธ๋ฃนํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ํ ์ฌ์ฉ์ ์ ์ ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ทธ๋ฃน์ ๋ํ ๋ ๋ณต์กํ ํต๊ณ๋ฅผ ๊ณ์ฐํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ด์
- ๋ฐ์ดํฐ ์กฐ์งํ: ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ถ์ํ๋ ๊ตฌ์กฐํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ๋ชฉํ ๋ถ์: ๋ฐ์ดํฐ์ ํ์ ์งํฉ์ ๋ํด ๋ชฉํ๊ฐ ๋ช ํํ ๋ถ์ ๋ฐ ๊ณ์ฐ์ ์ํํ ์ ์์ต๋๋ค.
- ๋ก์ง ๋จ์ํ: ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋จ๊ณ๋ก ๋ถํดํ์ฌ ๋จ์ํํ ์ ์์ต๋๋ค.
๋ฐฐ์น ์ฒ๋ฆฌ์ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๊ฒฐํฉํ๊ธฐ
์ด๋ค ๊ฒฝ์ฐ์๋ ์ต์ ์ ์ฑ๋ฅ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ฐฐ์น ์ฒ๋ฆฌ์ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ๊ฒฐํฉํด์ผ ํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์ง๋ฆฌ์ ์ง์ญ ๋ด์ ์ฌ์ฉ์์ ๋ํ API ์์ฒญ์ ์ผ๊ด ์ฒ๋ฆฌํ๊ฑฐ๋ ํธ๋์ญ์ ์ ํ๋ณ๋ก ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋๋ฅผ ๋ฐฐ์น๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์์ : ๊ทธ๋ฃนํ๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ฐฐ์น ์ฒ๋ฆฌ
API ์์ฒญ ์์ ๋ฅผ ํ์ฅํ์ฌ ๋์ผํ ๊ตญ๊ฐ ๋ด์ ์ฌ์ฉ์์ ๋ํ API ์์ฒญ์ ์ผ๊ด ์ฒ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ์ฌ์ฉ์ ID๋ฅผ ๊ตญ๊ฐ๋ณ๋ก ๊ทธ๋ฃนํํ ๋ค์ ๊ฐ ๊ตญ๊ฐ ๋ด์์ ์์ฒญ์ ๋ฐฐ์น ์ฒ๋ฆฌํฉ๋๋ค.
async function fetchUserData(userId) {
// API ์์ฒญ์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค
return new Promise(resolve => {
setTimeout(() => {
resolve({ userId: userId, data: `Data for user ${userId}` });
}, 50);
});
}
async function* usersByCountry() {
yield { userId: 1, country: "USA" };
yield { userId: 2, country: "Canada" };
yield { userId: 3, country: "USA" };
yield { userId: 4, country: "UK" };
yield { userId: 5, country: "Canada" };
yield { userId: 6, country: "USA" };
}
async function processUserBatchesByCountry(batchSize) {
for (const countryGroup of groupBy(usersByCountry(), user => user.country)) {
const country = countryGroup.key;
const userIds = countryGroup.values.map(user => user.userId);
for (const batchOfIds of batch(userIds, batchSize)) {
const userDataPromises = batchOfIds.map(fetchUserData);
const userData = await Promise.all(userDataPromises);
console.log(`Processed batch for ${country}:`, userData);
}
}
}
// ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ตญ๊ฐ๋ณ๋ก ๊ทธ๋ฃนํํ์ฌ 2๊ฐ์ฉ ๋ฐฐ์น๋ก ์ฒ๋ฆฌ
processUserBatchesByCountry(2);
์ด ์์ ์์ usersByCountry ์ ๋๋ ์ดํฐ ํจ์๋ ๊ตญ๊ฐ ์ ๋ณด๊ฐ ํฌํจ๋ ์ฌ์ฉ์ ๊ฐ์ฒด ์คํธ๋ฆผ์ ์ฐ์ถํฉ๋๋ค. groupBy ํจ์๋ ์ด ์ฌ์ฉ์๋ค์ ๊ตญ๊ฐ๋ณ๋ก ๊ทธ๋ฃนํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ processUserBatchesByCountry ํจ์๋ ์ด ๊ทธ๋ฃน๋ค์ ๋ฐ๋ณตํ๋ฉด์ ๊ฐ ๊ตญ๊ฐ ๋ด์ ์ฌ์ฉ์ ID๋ฅผ ๋ฐฐ์น ์ฒ๋ฆฌํ๊ณ ๊ฐ ๋ฐฐ์น์ ๋ํ API ์์ฒญ์ ์ํํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ์์์ ์ค๋ฅ ์ฒ๋ฆฌ
์ดํฐ๋ ์ดํฐ ํฌํผ๋ก ์์ ํ ๋, ํนํ ๋น๋๊ธฐ ์์ ์ด๋ ์ธ๋ถ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ํ์์ ์ ๋๋ค. ์ดํฐ๋ ์ดํฐ ํฌํผ ํจ์ ๋ด์์ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ด๋ฅผ ํธ์ถ ์ฝ๋๋ก ์ ์ ํ๊ฒ ์ ํํด์ผ ํฉ๋๋ค.
๋น๋๊ธฐ ์์ ์์์ ์ค๋ฅ ์ฒ๋ฆฌ
์ดํฐ๋ ์ดํฐ ํฌํผ ๋ด์์ ๋น๋๊ธฐ ์์
์ ์ฌ์ฉํ ๋๋ try...catch ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ์ค๋ฅ ๊ฐ์ฒด๋ฅผ ์ฐ์ถํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๋ค์ ๋์ ธ ํธ์ถ ์ฝ๋์์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค.
async function* asyncIteratorWithError() {
for (let i = 1; i <= 5; i++) {
try {
if (i === 3) {
throw new Error("Simulated error");
}
yield await Promise.resolve(i);
} catch (error) {
console.error("Error in asyncIteratorWithError:", error);
yield { error: error }; // ์ค๋ฅ ๊ฐ์ฒด ์ฐ์ถ
}
}
}
async function processIterator() {
for (const value of asyncIteratorWithError()) {
if (value.error) {
console.error("Error processing value:", value.error);
} else {
console.log("Processed value:", value);
}
}
}
processIterator();
ํค ์ ํ์ ํจ์์์์ ์ค๋ฅ ์ฒ๋ฆฌ
groupBy ํฌํผ์์ ํค ์ ํ์ ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํค ์ ํ์ ํจ์๊ฐ null ๋๋ undefined๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
์ดํฐ๋ ์ดํฐ ํฌํผ๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์กฐ์ํ๋ ๊ฐ๊ฒฐํ๊ณ ํํ๋ ฅ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ๋๋ ์ดํฐ ํจ์๋ ์ ํต์ ์ธ ๋ฃจํ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๋นํด ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํฅ์๋ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ด์ ์ด ์ฑ๋ฅ ๋น์ฉ์ ์์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ํ ๋ฐฐ์น ์ฒ๋ฆฌ์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ์ธ๋ถ ๋ฐ์ดํฐ ์์ค๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ์ ๊ทน์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ ์ฑ๋ฅ ์ต์ ํ
- ํจ์ ํธ์ถ ์ต์ํ: ์ดํฐ๋ ์ดํฐ ํฌํผ ๋ด์์, ํนํ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ฝ๋ ์น์ ์์ ํจ์ ํธ์ถ ์๋ฅผ ์ค์ด์ญ์์ค.
- ๋ถํ์ํ ๋ฐ์ดํฐ ๋ณต์ฌ ๋ฐฉ์ง: ์ดํฐ๋ ์ดํฐ ํฌํผ ๋ด์์ ๋ถํ์ํ ๋ฐ์ดํฐ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ง ๋ง์ญ์์ค. ๊ฐ๋ฅํ๋ฉด ์๋ณธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ํด ์์ ํ์ญ์์ค.
- ํจ์จ์ ์ธ ์๋ฃ ๊ตฌ์กฐ ์ฌ์ฉ: ์ดํฐ๋ ์ดํฐ ํฌํผ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๋ฐ
Map๋ฐSet๊ณผ ๊ฐ์ ํจ์จ์ ์ธ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ญ์์ค. - ์ฝ๋ ํ๋กํ์ผ๋ง: ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฝ๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋ฐฐ์น ์ฒ๋ฆฌ ๋ฐ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๊ฐ์ ๊ธฐ๋ฒ๊ณผ ๊ฒฐํฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ด๊ณ ํจ๊ณผ์ ์ผ๋ก ์กฐ์ํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ๊ณผ ๊ทธ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ดํดํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ํฌํ๋ก์ฐ๋ฅผ ์ต์ ํํ๊ณ ๋ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ๊ธ์ต ๊ฑฐ๋๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํ๋ ๊ฒ๋ถํฐ ์ธ๊ตฌ ํต๊ณ๋ณ๋ก ๊ทธ๋ฃนํ๋ ์ฌ์ฉ์ ํ๋์ ๋ถ์ํ๋ ๊ฒ๊น์ง ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ๊ฒฐํฉํ๋ ๋ฅ๋ ฅ์ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ ์ฌํญ์ ๋ง์ถฐ ๊ณ ๋๋ก ๋ง์ถคํ๋๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ด๋ฌํ ํ๋์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ ๋ณต์กํ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.